﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dao.Intermediarios;
using _InformaticaIndustrial_DerivdosVinicos.DTO;
using Dao;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class OP2 : Form
    {
        OrdenProduccion opEntity;
        int cant;
        IList<OrdenProduccion> opList;
        Producto prod;
        DetalleOP detOP;

        public OP2(int cantidad, Producto p)
        {
            InitializeComponent();
            CargarOP();
            this.cant = cantidad;
            this.prod = p;
            comboBoxProducto.DataSource = new IPProducto().getAll<Producto>();
        }

        public void CargarOP()
        {

            //fecha de la orden de produccion
            this.txtFecha.Text = DateTime.Now.ToShortDateString();
            //asigna el estado pendiente
            txtEstado.Text = "pendiente";
            txtCant.Text = cant.ToString();
            comboBoxProducto.SelectedValue = prod.IdProducto;
            opList = new IPOrdenProduccion().getAll<OrdenProduccion>().OrderBy(op => op.nroOP).ToList();

            if (opList.Count > 0)
            {
                opEntity = opList.Last();
                txtNroOP.Text = opEntity.nroOP.ToString();
            }
            else
            {
                txtNroOP.Text = "1";
            }

            opEntity = new OrdenProduccion();

            opEntity.fechaCreacion = Convert.ToDateTime(txtFecha);
            opEntity.estado = "Pendiente";
            opEntity.nroOP = Convert.ToInt32(txtNroOP.Text);

            detOP = new DetalleOP();
            detOP.cantidad = Convert.ToInt32(txtCant.Text);
            detOP.IdProducto = prod.IdProducto;

            ConsultarStock();
        }

        private void ConsultarStock()
        {
            try
            {  List<EstructuraProducto> listaEP = new IPEstructuraProducto().getByCriterio<EstructuraProducto>("IdProducto", "=", prod.IdProducto.ToString());
               IList<MateriaPrima>mp;
               IList<Componente>comp;
               int cantMPNecesaria;
               int cantPCNecesario;
                  

               foreach(var ep in listaEP)
               {
                 //por cada materia prima/componente que utiliza, obtener la cantidad por producto
                   if (ep.IdMateriaPrima != null){

                       cantMPNecesaria = (cant * Convert.ToInt16(ep.cantidadMP)) / Convert.ToInt16(ep.CantidadAProducir);//agregar esto al codigo de carla
                       
                       mp = new IPMateriaPrima().getByCriterio<MateriaPrima>("IdMP","=", ep.IdMateriaPrima.ToString());
                       //MateriaPrima m=mp.ElementAt(0);
                       foreach (var m in mp)
                       {
                           if (m.cantidad >= cantMPNecesaria)
                           {
                               m.cantidad = m.cantidad - cantMPNecesaria;
                               Intermediario.confirmarCambios();
                           }
                           else
                           {
                               //mostrarMensaje();
                               //this.Close();
                           }
                       }
                   }

                   if (ep.IdComponente != null)
                   {
                       cantPCNecesario = cant * Convert.ToInt16(ep.cantidadPC);
                       comp = new IPComponente().getCriterioById<Componente>("IdComponente", "=",Convert.ToInt16(ep.IdComponente));
                       //Componente c=comp.ElementAt(0);
                       foreach (var c in comp)
                       {
                           if (c.cantidad >= cantPCNecesario)
                           {
                               c.cantidad = c.cantidad - cantPCNecesario;
                               Intermediario.confirmarCambios();
                           }
                           else
                           {
                               this.Close();
                           }
                       }
                  }
                 }
            }
            catch (Exception)
            {
                
                throw;
            }
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {

        }

        //private void mostrarMensaje()
        //{
        //    DialogResult result = MessageBox.Show("La cantidad de MP es insuficiente. Desea crear una nueva OC?", "Atención", MessageBoxButtons.OKCancel);

        //    if (result == DialogResult.OK)
        //    {
        //        Form interf = new NuevaOrdenCompra(null);
        //        this.Visible = true;
        //        interf.Visible = true;
        //    }
        //    else
        //    {
        //        MessageBox.Show("No es posible crear la OP");
        //        this.Close();
        //    }
        //}
    }

}


